<?php

namespace app\upload\controller;

class Ocr
{

    function index()
    {

        $uploadDir = 'uploads/';
        $chunkSize = 1024 * 1024 * 5; // 每块的大小（5MB）

// 检查是否上传了文件
        if (isset($_FILES['file']) && isset($_POST['chunk']) && isset($_POST['totalChunks']) && isset($_POST['filename'])) {
            $file = $_FILES['file'];
            $chunkIndex = $_POST['chunk'];  // 当前分块
            $totalChunks = $_POST['totalChunks'];  // 总分块数
            $filename = $_POST['filename'];  // 文件名

            // 文件保存路径
            $filePath = $uploadDir . $filename . '.part' . $chunkIndex;

            // 移动上传的文件块
            if (move_uploaded_file($file['tmp_name'], $filePath)) {
                // 如果是最后一块，开始合并文件
                if ($chunkIndex == $totalChunks - 1) {
                    // 合并文件
                    $finalPath = $uploadDir . $filename;
                    $finalFile = fopen($finalPath, 'ab');  // 以追加模式打开文件

                    for ($i = 0; $i < $totalChunks; $i++) {
                        $partFile = $uploadDir . $filename . '.part' . $i;
                        $partData = file_get_contents($partFile);
                        fwrite($finalFile, $partData);  // 将分块写入最终文件

                        unlink($partFile);  // 删除已合并的块文件
                    }

                  

                    $result = $this->extract($uploadDir . $filename);

                    if ($result) {
                        echo json_encode([ "code"=>200,  'message' => '文件合并完成', 'data' => $result]);
                    } else {
                        echo json_encode([ "code"=>500,  'message' => '文件合并失败', 'data' => $result]);
                    }
                } else {

                    echo json_encode([ "code"=>200,  'message' => '上传成功']);
                }
            } else {
                http_response_code(500);
                echo json_encode([ "code"=>500,  'message' => '上传失败']);
            }
        } else {
            http_response_code(400);
            echo json_encode([ "code"=>400,  'message' => '无效的请求']);
        }

    }

    // 解压文件
    function extract($filePath)
    {
        // ZIP 文件路径
        $zipFilePath = config('path') . $filePath;

        $fileName = pathinfo($filePath, PATHINFO_FILENAME);

  
        $targetDir = config('path') . "ocr/";

        // 确保目标目录存在
        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0777, true);
        }

        // 目标目录名称是zip文件的名称
        $folderName = pathinfo($filePath, PATHINFO_FILENAME);
        $uniqueId = time() . '_' . mt_rand(1000, 9999);
        $targetDir = $targetDir . $uniqueId;


        
        // 确保目标目录存在
        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0777, true);
        }
        
        // 记录日志
        $logFile = fopen(config('path') . "zip_extract_log.txt", "w");
        fwrite($logFile, "开始解压文件：" . $zipFilePath . "\n");
        fwrite($logFile, "目标目录：" . $targetDir . "\n");
      
        
        // 方法1：尝试使用PHP内置ZipArchive类解压（处理基本文件）
        $success = false;
        
        try {
            $zip = new \ZipArchive();
            if ($zip->open($zipFilePath) === TRUE) {
                // 直接解压到目标目录
                if ($zip->extractTo($targetDir)) {
                    fwrite($logFile, "使用PHP ZipArchive成功解压文件\n");
                    $success = true;
                } else {
                    fwrite($logFile, "PHP ZipArchive解压失败\n");
                }
                $zip->close();
            } else {
                fwrite($logFile, "无法打开ZIP文件\n");
            }
        } catch (\Exception $e) {
            fwrite($logFile, "PHP ZipArchive异常: " . $e->getMessage() . "\n");
        }
        
        // 方法2：如果方法1失败，尝试使用系统unzip命令（对中文支持更好）
        if (!$success) {
            fwrite($logFile, "尝试使用系统unzip命令解压...\n");
            
            // 构建unzip命令
            $escapedZipPath = escapeshellarg($zipFilePath);
            $escapedTargetDir = escapeshellarg($targetDir);
            
            // 使用-O选项指定编码（根据需要可选GB18030、GBK或UTF-8）
            $command = "unzip -O CP936 $escapedZipPath -d $escapedTargetDir";
            
            // 执行命令
            $output = [];
            $result = 0;
            exec($command . " 2>&1", $output, $result);
            
            // 记录输出
            fwrite($logFile, "Unzip命令: $command\n");
            fwrite($logFile, "执行结果: " . ($result === 0 ? "成功" : "失败(代码: $result)") . "\n");
            fwrite($logFile, "输出:\n" . implode("\n", $output) . "\n");
            
            if ($result === 0) {
                $success = true;
            }
        }
        
        // 方法3：最后的备选方案 - 使用7z命令
        if (!$success) {
            fwrite($logFile, "尝试使用7z命令解压...\n");
            
            $escapedZipPath = escapeshellarg($zipFilePath);
            $escapedTargetDir = escapeshellarg($targetDir);
            
            // 7z命令通常处理各种编码情况很好
            $command = "7z x -y $escapedZipPath -o$escapedTargetDir";
            
            // 执行命令
            $output = [];
            $result = 0;
            exec($command . " 2>&1", $output, $result);
            
            // 记录输出
            fwrite($logFile, "7z命令: $command\n");
            fwrite($logFile, "执行结果: " . ($result === 0 ? "成功" : "失败(代码: $result)") . "\n");
            fwrite($logFile, "输出:\n" . implode("\n", $output) . "\n");
        }
        
        fwrite($logFile, "解压过程完成\n");
        fclose($logFile);
        
        if ($success) {

            return $targetDir . "/" . $fileName;
            

        } else {
            return false;
            return "解压文件时遇到问题，请查看日志了解详情。";
        }
    }


}